package kaumono.service;

import java.util.logging.Logger;

import kaumono.util.BeanMapUtil;
import kaumono.util.KeyUtil;
import susano.common.util.BeanMap;
import susano.datastore.manager.DatastoreManager;

import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
import com.google.appengine.api.datastore.Query;

/**
 * ルートエンティティサービス
 *
 * @author tanaka.akira.2006
 * @version $Id: RootService.java 687 2009-11-13 07:55:17Z tanaka.akira.2006 $
 */
public class RootService {

	protected DatastoreManager dm = new DatastoreManager();

	protected static Logger logger = Logger.getLogger(RootService.class
			.getName());

	/** Kind */
	public static final String KIND = "Root";

	/**
	 * ルートエンティティ {@link BeanMap} を取得
	 *
	 * @param keystr
	 *            {@link Key} 文字列
	 * @return ルートエンティティ {@link BeanMap}
	 */
	public BeanMap get(final String keystr) {
		Key key = KeyFactory.stringToKey(keystr);
		Query query = new Query(key);
		Entity entity = dm.asSingleEntity(query);
		if (entity == null) {
			logger.warning("Rootエンティティが存在しません。keystr=" + keystr);
			return null;
		}
		return new BeanMap(entity.getProperties());
	}

	/**
	 * ルートエンティティ {@link BeanMap} を保存
	 *
	 * @param root
	 *            {@link BeanMap}
	 * @return true==成功 | false==失敗
	 */
	public boolean put(BeanMap root) {
		Key key = createKey();
		Entity entity = BeanMapUtil.createRootEntity(root, key);
		dm.put(entity);
		return dm.commit();
	}

	/**
	 * ルートエンティティのKeyを返します。
	 *
	 * @return {@link Key}
	 */
	public Key createKey() {
		return KeyUtil.createParentKey(KIND);
	}

	/**
	 * ルートエンティティのKeyを返します。
	 *
	 * @return {@link Key}文字列
	 */
	public String createKeyAsString() {
		Key key = createKey();
		return KeyFactory.keyToString(key);
	}
}
